package mx.com.switz.dao.Impl;

import java.util.List;
import javax.sql.DataSource;
import mx.com.switz.dao.ProductoDao;
import mx.com.switz.dto.Producto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class ProductoDaoImpl extends JdbcDaoSupport implements ProductoDao {

    private SimpleJdbcInsert simpleJdbcInsert;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public ProductoDaoImpl(DataSource dataSource) {

        setDataSource(dataSource);
        simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate().getDataSource()).withTableName("producto");
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }
    private static final String SQL_UPDATE_PRODUCTO = "UPDATE producto set nombre = :nombre,claveProducto = :claveProducto,detalles = :detalles,precio = :precio WHERE clave =:clave";
    private static final String SQL_DELETE_PRODUCTO = "DELETE FROM producto WHERE clave = :clave";
    private static final String SQL_SELECT_PRODUCTO = "SELECT clave,claveProducto,nombre,detalles,precio FROM producto";
    private static final String SQL_SELECT_PRODUCTO_BY_NOMBRE = SQL_SELECT_PRODUCTO + " WHERE nombre = :nombre";

    @Override
    public void insertProducto(Producto producto) {
        
        SqlParameterSource parameters = new BeanPropertySqlParameterSource(producto);
        simpleJdbcInsert.execute(parameters);
    }

    @Override
    public void updateProducto(Producto producto) {
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(
                producto);
        this.namedParameterJdbcTemplate.update(SQL_UPDATE_PRODUCTO,
                parameterSource);
    }

    @Override
    public void deleteProducto(Producto producto) //throws EjecucionException
    {
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(producto);
        this.namedParameterJdbcTemplate.update(SQL_DELETE_PRODUCTO, parameterSource);
    }

    @Override
    public List selectProductoByNombre(Producto producto) {
        String query = SQL_SELECT_PRODUCTO_BY_NOMBRE;
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(producto);
        return namedParameterJdbcTemplate.query(query, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Producto.class));

    }

    @Override
    public List<Producto> findAllProductos() {
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(Producto.class);
        return namedParameterJdbcTemplate.query(SQL_SELECT_PRODUCTO, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Producto.class));

    }
}

